#ifndef MODBUS_MASTER_H
#define MODBUS_MASTER_H

#include <stdint.h>
#include <modbus.h> // 依赖libmodbus库

#include <thread>
#include "config/config.h"
#include "error_code_loader.h"
// #include "modbus_def.h"

namespace equip_system
{
/*
    回调函数
    pdata : 输入数据
    len :  输入数据个数
    lpOwner ： 父指针
*/
typedef int(CALLBACK *LPGETDATA)(IN uint16_t *pdata, IN uint8_t len, IN LPVOID lpOwner);

class ModbusMaster
{
public:
    ModbusMaster();
    ModbusMaster(const string &_ip, int _port, LPGETDATA _callback_data = nullptr, LPVOID _parent = nullptr);
    ~ModbusMaster();

    // 初始化 Modbus slave
    bool Start(/*int modbusPort=0 */);

    // 连接 Modbus slave
    bool Run();

    // 停止运行
    void Stop();
    
    // ... 现有方法 ...
    bool isConnected() const { 
        return is_connected; // 假设内部有is_connected成员变量记录连接状态
    }

    // 获取来自 Modbus slave 的数据并更新到本地
    int readData(NodeData_Config &data);

    // 加载错误码配置文件
    bool loadErrorCodes(const std::string& file_path);
    
    // 根据错误码获取描述
    std::string getErrorDescription(int error_code) const;

private:
    /*
     */
    // int _read_FUN_01();
    int _read_FUN_Code(std::vector<EquipProperty>& list);

    /*
     */
    string _ASCII2String(const uint16_t value);

private:
    ErrorCodeLoader error_code_loader_;  // 错误码加载器

private:
    string ip;
    int port; // Modbus端口（默认502）
    modbus_t *ctx;
    bool is_connected;
    std::thread thread_;

    LPGETDATA callback_data;
    LPVOID callback_parent;
};

}; // namespace equip_system

#endif // MODBUS_MASTER_H
